import java.util.Arrays;

public class BulletDistribution {
    public static int minBullets(int[] scores) {
        int n = scores.length;
        // 初始化所有士兵至少有1颗子弹
        int[] bullets = new int[n];
        Arrays.fill(bullets, 1);
        int[] xbullets = getNewbullets(scores, n, bullets);
        //将原始scores进行首尾反转 形成一个新的scores
        int[] newscores = new int[n];
        for (int i = 0; i < n; i++) {
            newscores[i] = scores[n - 1 - i];
        }
        int[] ybullets = getNewbullets(newscores, n, bullets);
        //构建一个新的数组,对2个数组进行比较合并,合并规则是: 比较相同索引上的值的大小,然后取最大值,将最大值放在新数组的相同索引位置
        int[] newbullets = new int[n];
        for (int i = 0; i < n; i++) {
            newbullets[i] = Math.max(xbullets[i], ybullets[i]);
        }

        // 计算总子弹数
        int totalBullets = 0;
        for (int bullet : newbullets) {
            System.out.print(bullet + "-");
            totalBullets += bullet;
        }
        return totalBullets;
    }

    private static int[] getNewbullets(int[] scores, int n, int[] bullets) {
        //复制bullets
        int[] xbullets = new int[n];
        System.arraycopy(bullets, 0, xbullets, 0, n);
        // 遍历士兵评分数组
        for (int i = 1; i < n - 1; i++) {  // 注意：这里不包括首尾，因为它们的处理逻辑稍有不同
            if (scores[i] > scores[i - 1] || scores[i] > scores[i + 1]) {
                xbullets[i] = Math.max(xbullets[i], xbullets[i - 1] + 1);
            }
        }
        // 特殊处理首尾士兵
        if (n > 1) {
            // 首个士兵仅与下一个士兵比较
            if (scores[0] > scores[1]) {
                xbullets[0] = 2;
            }
            // 最后一个士兵仅与上一个士兵比较
            if (scores[n - 1] > scores[n - 2]) {
                xbullets[n - 1] = Math.max(xbullets[n - 1], xbullets[n - 2] + 1);
            }
        }

        return xbullets;
    }

    public static void main(String[] args) {
//        System.out.println(minBullets(new int[]{1, 0, 2}));
        System.out.println(minBullets(new int[]{1, 2, 3, 4, 5, 5, 5, 3, 1}));
    }
}
